<?php

/**
 * Sgit_Util_Cache
 * 
 * @package local
 * @author juanma
 * @copyright 2012
 * @version $Id$
 * @access public
 * 
 * Esta clase nos permite crear una unica instancia en todo el tiempo de ejecucion para utiles 
 * 
 * 
 */
class Sgit_Memory
{

    protected static $singleton = NULL;
    
    protected $_model = NULL;
    protected $_clave = NULL;
    protected $_data = FALSE;
    

    public static function single()
    {
        // Si la clase no está instanciada la creamos.
        if(self::$singleton == NULL)
        {
            self::$singleton = new Sgit_Memory();
        }
        
        // Devolvemos la instancia de la clase
        return self::$singleton;
    }
    
 
    public function model($model)
    {
        $this->_model='Application_Model_'.$model;
        $this->_clave=md5($this->_model);
        
        if(!$this->_data[$this->_clave])
        {

            if (!class_exists($this->_model))
            {
                throw new Zend_Exception(sprintf('La clase %s no esta definida en %s',$this->_model,get_called_class()));
            }
            
            $modelo = new $this->_model();
            
            $this->_data[$this->_clave] = $modelo->cacheAssoc();
           
        }

        return $this;
    }
    
    

    public function get($id,$key='nombre')
    {
      

            if(is_numeric($id))
            {
                if($key){
                    return $this->getOne($key,$id);
                }else{
                    return $this->getRow($id);
                }
                
            }elseif(empty($id) || is_null($id)){
                return null;
            }else{
                 return $this->getAll();
            }

    }
    
    public function getId($id)
    {
        return $this->_data[$this->_clave][$id];
    }
    

    public function getKey($id,$key='nombre')
    {
        return $this->_data[$this->_clave][$id][$key];
    }
    
    public function getOne($col,$id)
    {
        return $this->getRow($id,$col);
    }
    
    
    public function getRow($id,$values=null)
    {
        if(is_array($values)){
            foreach($values as $v){
                $salida[$v]= $this->_data[$this->_clave][$id][$v];
            }
        }elseif($values){
             $salida= $this->_data[$this->_clave][$id][$values];
        }else{
            $salida= $this->_data[$this->_clave][$id];
        }
        
        return $salida;
        
    }
    
    public function getAll($values=null)
    {
        
        foreach($this->_data[$this->_clave] as $k => $row)
        {
            $salida[$k]=$this->getRow($row['id'],$values);
        }
        
        
        return $salida;
    }
    
    public function getCol($col)
    {
       return $this->getAll($col);
    }
    
    /**
    *Ejemplo callback
    *   $lambda=function($val) { 
    *        $idZona = Zend_Controller_Front::getInstance()->getRequest()->getParam('idZona');
    *        return $val['id_zona'] == $idZona; 
    *    };
    *
    *
    */

    public function filter($callback)
    {


        if($callback)
            $this->_data[$this->_clave]= array_filter($this->_data[$this->_clave], $callback);

        return $this;
    }

    public function getAssoc($key = 'id', $values = null)
    {
        return  Sgit_Util_Array::assocSimpleBy($this->_data[$this->_clave],$key,$values);
   
    }
    
    
    public function getMultiAssoc($key = 'id', $values = null)
    {
        return  Sgit_Util_Array::assocBy($this->_data[$this->_clave],$key,$values);
    }
    
    

    // Sobreescribimos el método __clone para que produzca un error.
    public function __clone()
    {
        throw new Zend_Exception("No se puede clonar la clase Singleton.");
    }

}
